package com.atguigu.spring6.aop.example;

import org.springframework.cglib.proxy.InvocationHandler;
import org.springframework.cglib.proxy.Proxy;

import java.lang.reflect.Method;
import java.util.Arrays;

/**
 * @author: Michael
 * @date: 2025/5/15
 * @desc:
 */
public class ProxyFactory {

    private Object target;
    public ProxyFactory(Object target)
    {
        this.target = target;
    }

    public Object getProxy() {
        /**
         * Proxy.newProxyInstance()方法
         * 有三个参数
         * 第一个参数：ClassLoader：加载动态生成代理类的类加载器
         * 第二个参数： Class[] interfaces: 目录对象实现的所有接口有的class类型数组
         * 第三个参数： InvocationHandler： 设置代理对象实现目标对象方法的过程
         **/
        // 参数1
        ClassLoader classLoader = target.getClass().getClassLoader();
        // 参数2
        Class<?>[] interfaces = target.getClass().getInterfaces();
        // 参数3
        InvocationHandler invocationHandler = new InvocationHandler() {
            // 第一个参数： 代理对象
            // 第二个参数： 需要重写目标对象的方法
            // 第三个参数： method方法里面的参数
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("[动态代理][日志] " + method.getName() + ", 参数： " + Arrays.toString(args));
                Object result = method.invoke(target, args);

                System.out.println("[动态代理][日志] " + method.getName() + ", 结果： " + result);
                return result;
            }
        };

        return Proxy.newProxyInstance(classLoader, interfaces, invocationHandler);
    }
}
